import { getSetting, chooseAddress, openSetting,showModal,showToast } from "../../utils/asyncWx.js"
import regeneratorRuntime from '../../lib/runtime/runtime'

// pages/cart/index.js
Page({
  data: {
    // 用户地址
    address: {},
    cart: [],
    allChecked: false,
    totalPrice: 0,
    totalNum: 0,

  },
  onShow() {
    // 1. 获取缓存中的收获地址信息
    let address = wx.getStorageSync("address");
    // 1. 获取缓存中的购物车数据
    let cart = wx.getStorageSync("cart") || [];
    this.setData({
      address
    })
    this.setCart(cart)
  },

  // 设置购物车同时，计算底部工具栏数据
  setCart(cart) {
    // 1. 计算全选
    // every 数组方法，会遍历，会接收每一个回调函数，那么每一个回调函数都返回 true 那么every 方法的返回值为 true 
    // 只要有一个回调函数返回了 false 那么不在循环执行，直接返回 false
    // 空数组 调用 every 的时候，返回 true 所以需要判断一下该数组的 length 长度
    // let allChecked = cart.length?cart.every(v => v.checked):false;
    let allChecked = true;
    // 1. 总价格 总数量
    let totalPrice = 0;
    let totalNum = 0;
    cart.forEach(v => {
      if (v.checked) {
        totalPrice += v.num * v.goods_price;
        totalNum += v.num
      } else {
        allChecked = false;
      }
    })
    allChecked = cart.length != 0 ? allChecked : false;

    this.setData({
      cart,
      allChecked,
      totalPrice,
      totalNum
    })
    // this.setCart(cart)
  },
  // 点击按钮添加收货地址
  async handleChooseAdress() {
    try {
      // 1. 获取权限状态
      let res1 = await getSetting();
      let scopeAddress = res1.authSetting["scope.address"]
      // 2. 判断权限状态
      if (scopeAddress === false) {
        await openSetting()
      }
      // 4. 调用获取地址的 api 
      let address = await chooseAddress()
      address.all = address.provinceName + address.cityName + address.countyName + address.detailInfo;
      wx.setStorageSync("address", address);

    } catch (error) {
      console.log(error)
    }
  },

  // 商品 复选框
  handleItemCahnge(e) {
    // 1. 获取被修改的商品 id 
    let goods_id = e.currentTarget.dataset.id;
    // 2. 获取购物车数组
    let { cart } = this.data;
    // 3. 找到被修改的商品对象
    let index = cart.findIndex(v => v.goods_id === goods_id);
    // 4. 选中状态取反
    cart[index].checked = !cart[index].checked;
    // 5. 6. 把购物车数据重新设置回 data 中和数组中
    this.setData({
      cart
    });
    wx.setStorageSync("cart", cart)
    this.setCart(cart)
  },

  // 全选按钮
  handleItemAllChange() {
    let { cart, allChecked } = this.data;
    allChecked = !allChecked;
    cart.forEach(v => v.checked = allChecked)
    this.setCart(cart)
  },

  // 点击按钮，添加或减少商品数量
  async handleItemNumEdit(e) {
    // 1. 获取传递过来的参数
    let { operation, id } = e.currentTarget.dataset;
    // 2. 获取购物车的数组
    let { cart } = this.data;
    // 3. 找到需要修改的商品的索引
    let index = cart.findIndex(v => v.goods_id === id)
    // 4. 判断是否执行删除
    if (cart[index].num === 1 && operation === -1) {
      // 4.1 弹窗提示
      let res = await showModal({content: "您确定要删除此商品？"});
      if (res.confirm) {
        cart.splice(index,1)
        this.setCart(cart)
      }
    } else {
      // 4. 进行修改数量
      cart[index].num += operation;
      // 5. 设置回返回和 data 中
      this.setCart(cart)
    }
    wx.setStorageSync("cart", cart);
  },
  // 结算
  async handlePay(){
    // 1. 判断收获地址
    let {address,totalNum} = this.data;
    if(!address.userName){
      await showToast({title:"您还没有选择收货地址"});
      return;
    }
    // 2. 判断用户有没有选购商品
    if(totalNum === 0){
      await showToast({title:"您还没有选购商品"});
      return;
    }
    // 3. 跳转到支付页面
    wx.navigateTo({
      url: '/pages/pay/index'
    });
  }
})